Lo que estoy tratando de lograr es algún tipo de forma de almacenar en caché los resultados de una consulta mongoDB/Mongoose que puedo usar en mis vistas y rutas. Necesitaría poder actualizar este caché cada vez que se agregue un nuevo documento a la colección. No estoy seguro de si esto es posible y si es así, cómo hacerlo, debido a que las funciones son asíncronas.
Esto es lo que tengo actualmente para almacenar las galerías, sin embargo, esto se ejecuta con cada solicitud.
app.use(function(req, res, next) { Gallery.find(function(err, galleries) { if (err) throw err; res.locals.navGalleries = galleries; next(); }); });Esto se usa para obtener los nombres de las galerías, que luego se muestran en la barra de navegación desde una galería generada dinámicamente. El modelo de la galería se configura con solo un nombre de la galería y un slug
y esto es parte de mi vista EJS dentro de mi navegación que almacena los valores en un menú desplegable.
<% navGalleries.forEach(function(gallery) { %> <li> <a href='/media/<%= gallery.slug %>'><%= gallery.name %></a> </li> <% }) %>Se espera que el sitio web en el que estoy trabajando obtenga cientos de miles de usuarios simultáneos, por lo que no quiero tener que consultar la base de datos para cada solicitud si no es necesario, y simplemente actualizarla cada vez que se crea una nueva galería.
Echa un vistazo a cachegoose . Le permitirá almacenar en caché cualquier consulta que desee e invalidar esa entrada de caché cada vez que se cree una nueva galería.
Necesitarás algo como esto:
const mongoose = require('mongoose'); const cachegoose = require('cachegoose'); cachegoose(mongoose); // You can specify some options here to use Redis instead of in-memory cache app.get(function(req, res, next) { ... Gallery .find() .cache(0, 'GALLERY-CACHE-KEY') .exec(function(err, galleries) { if (err) throw err; res.locals.navGalleries = galleries; next(); }); ... }); app.post(function(req, res, next) { ... new Gallery(req.body).save(function (err) { if (err) throw err; // Invalidate the cache as new data has been added: cachegoose.clearCache('GALLERY-CACHE-KEY'); }); ... });Aunque podría hacer algo más simple almacenando en caché los resultados manualmente en una variable e invalidando ese caché cuando se agregan nuevas galerías, le aconsejo que eche un vistazo a ese paquete en su lugar.